package com.zhu.instructions.stack;

// instructions/stack/DUP_X2.java
import com.zhu.instructions.base.NoOperandsInstruction;
import com.zhu.rtda.Frame;
import com.zhu.rtda.OperandStack;
import com.zhu.rtda.Slot;

/**
 * 指令：dup_x2
 *
 * 操作数：无
 *
 * 功能：
 *  复制栈顶的单个变量，并将其插入到栈顶以下 2 个变量之下。
 *
 * 栈变化（两种情况）：
 *  情况1：三个单 slot 值
 *      ..., w, x, v → ..., v, w, x, v
 *  情况2：下面是一个双 slot 值（如 long/double）
 *      ..., w, v → ..., v, w, v  （w 是 long/double）
 *
 * 说明：
 *  - 弹出 v, x, w（或 v, w）
 *  - 压入顺序：v, w, x, v
 *
 * 注意：
 *  JVM 字节码验证器会确保栈结构合法，此处不判断类型。
 */
public class DUP_X2 extends NoOperandsInstruction {
    @Override
    public void execute(Frame frame) {
        OperandStack stack = frame.getOperandStack();
        Slot slot1 = stack.popSlot();  // v（栈顶）
        Slot slot2 = stack.popSlot();  // x 或 w
        Slot slot3 = stack.popSlot();  // w

        // 压回顺序：v, slot3, slot2, v
        stack.pushSlot(slot1);         // v（dup）
        stack.pushSlot(slot3);         // w
        stack.pushSlot(slot2);         // x
        stack.pushSlot(slot1);         // v（原值）
    }
}
